/**
 * author: Hanflyee  flyee1980@163.com
 * vision: v1.0
 * data: 2009-7-9
 */
package com.flyee.utils{
	
	import com.flyee.utils.ArrayUtil;	
	
	/**
	 * 被观察者 类
	 * 在被被观察者中注册N个观察者
	 * ，当被观察者触发通知（notifyObsevers）时
	 * ，依次遍历所有观察者并执行观察者的execute（）方法
	 */
	public class Obsevable{
		
		private var changed : Boolean = false;
	    private var obs : Array;
	   
	    public function Obsevable() {
			obs = new Array();
	    }
	
		/**注册观察者*/ 
	    public function addObserver(o : Obsever) : void {
	        if (o == null)
	            return ;
			if (obs.indexOf(o)<0) 
			    obs.push(o);
			
	    }
	
		/**注销观察者*/
	    public function deleteObserver(o : Obsever) : void {
	        ArrayUtil.remove(obs, o);
	    }
	
		/**通知观察者执行相关代码*/
	    public function notifyObsevers(command : String=null, ... args) : void {

			if (!changed)
				return;
            clearChanged();
				  	
	        for each(var obj : Object in obs){
	        	var obr : Obsever = obj as Obsever;
	        	obr.execute(this, command, args);
	        }
	    }
		 
		/**删除所有观察者*/
	    public function deleteObservers() : void{
			ArrayUtil.removeAll(obs);
	    }
		
		/**设置是否可修改*/
	    public function setChanged() : void{
			changed = true;
	    }
	
	    public function clearChanged() : void {
			changed = false;
	    }
	
	    public function hasChanged() : Boolean {
			return changed;
	    }
	
	    public function countObservers() : int {
			return obs.length;
	    }

	}
	
}